package com.ttmusic.core;

import java.util.List;
import java.util.Random;
import java.util.concurrent.ExecutorService;

import com.ttmusic.entity.AbstractMusic;
import com.ttmusic.entity.MusicInfo;
import com.ttmusic.utils.ThreadFactroy;
import com.ttmusic.utils.TimeUtil;

import android.media.MediaPlayer;
import android.os.Handler;
import android.os.Message;

/**
 * 音乐播放控制器  这是核心功能
 * @author wuchangyong
 *
 */
public class MusicManager {
    private static MusicManager instance;
    //播放器
    private MediaPlayer mp;
    //当前播放的歌曲
    private static AbstractMusic currentMusic;
//    //当前播放列表对象的adapter
//    private MusicAdapter musicAdapter;
    //循环模式(只在播放完毕后自动跳另一首歌时有效 用户点击播放时无效) 默认列表顺序循环
    private LoopMode loopMode = LoopMode.LOOP_LIST;
    //当前播放的歌曲是播放列表中的第几首
    private static int currentNo = -1;
    //线程池
    private ExecutorService mPlayThreadPool;
    //播放列表
    private static List<AbstractMusic> list;
    //音乐播放器的当前进度 暂停和来电时需要记录播放进度  用以提供给暂停后播放或挂断电话时恢复播放进度
  	private int currentPosition = 0;
  	//互斥变量，防止歌词界面进度条与定时器冲突。 是否允许改变SeekBar的进度 默认不允许 进入歌词界面后允许 退出歌词界面时不允许
  	public static boolean isAllowProgressBarChanging = false;
  	//是否来电响铃
  	public static boolean isPhoneRinging = false;
  	//提供给主界面改变界面文字
  	private Handler handler;
  	
  	

    private MusicManager() {
    	mPlayThreadPool = ThreadFactroy.get().getMusicOperateExecutor();//重新获取线程池
    }

    public static MusicManager getInstance() {
        if(instance == null) instance = new MusicManager();
        return instance;
    }

    /**
     * 暂停后恢复播放一首歌曲
     * @param music
     */
    public void playAfterPause() {
    	MusicManager.isAllowProgressBarChanging = true;
    	
        mPlayThreadPool.execute(new Runnable() {
            @Override
            public void run() {
            	//恢复到指定播放进度
            	mp.seekTo(currentPosition);
        		mp.start();
            }
        });
    }

    /**
     * 暂停
     */
    public void pause() {
    	MusicManager.isAllowProgressBarChanging = false;
    	
        mPlayThreadPool.execute(new Runnable() {
            @Override
            public void run() {
            	//记录下播放进度 然后暂停
        		currentPosition = mp.getCurrentPosition();
        		//暂停
        		mp.pause();
            }
        });
    }

    /**
     * 停止播放
     */
    public void stop() {
        mPlayThreadPool.execute(new Runnable() {
            @Override
            public void run() {
            }
        });
    }

    /**
     * 触摸滑动改变播放进度
     * @param mesc
     */
    public void seekTo(final int mesc) {
    	 mPlayThreadPool.execute(new Runnable() {
             @Override
             public void run() {
         		mp.seekTo(mesc);
             }
         });
    }

    /**
     * 准备播放
     * @param index
     */
    public void prepareAndPlay(final int index) {
    	MusicManager.isAllowProgressBarChanging = false;
        mPlayThreadPool.execute(new Runnable() {
            @Override
            public void run() {
            	try {
	            	destoryMediaPlayer();
	            	initMediaPlayer();
	            	currentNo = index;
	            	currentMusic = list.get(index);
	            	mp.setDataSource(currentMusic.getPath());
//	            	mp.setDataSource(context, currentMusic.getDataSoure());
					mp.prepare();
					mp.seekTo(0);
	                mp.start();
	                updateBottomActionBar();//自动改变BottomActionBar内的歌曲名称和艺术家名称
					//开始播放后 允许进度条改变进度
	                MusicManager.isAllowProgressBarChanging = true;
				} catch (Exception e) {
					e.printStackTrace();
				}
            }
        });
    }
    
    /**
     * 获取是否正在播放
     * @return
     */
    public boolean isPlaying() {
    	if(mp != null) return mp.isPlaying();
        return false;
    }

    /**
     * 获取正在播放的歌曲在播放列表中的索引
     * @return
     */
    public static int getNowPlayingIndex() {
        return currentNo;
    }
    /**
     * 切换排序方式更改当前播放歌曲的编号
     * @param index
     */
    public static void setNowPlayingIndex(int index) {
    	currentNo = index;
    }

    /**
     * 获取正在播放的歌曲
     * @return
     */
    public static AbstractMusic getNowPlayingSong() {
        return currentMusic;
    }

    /**
     * 下一首
     * @param isUserAction 是否为用户点击播放下一首 若不是则要根据looMode进行判断而播放不同的音乐
     */
    public void nextSong(final boolean isUserAction) {
    	mPlayThreadPool.execute(new Runnable() {
            @Override
            public void run() {
            	if(isUserAction) {
            		//若是用户点击播放下一首的则要跳到下一首 若当前播放的是最后一首 下一首则从头开始
            		currentNo = currentNo+1 >= list.size() ? 0 : currentNo + 1;
            	}else {
            		//不是点击播放下一首的则要根据looMode进行判断而播放不同的音乐
            		if(loopMode == LoopMode.LOOP_LIST) {//列表循环 则跳到下一首
            			currentNo = currentNo+1 >= list.size() ? 0 : currentNo + 1;
            		}else if(loopMode == LoopMode.LOOP_RANDOM) {//随机循环
            			currentNo = new Random().nextInt(list.size());//获取随机索引
            		}else if(loopMode == LoopMode.LOOP_SINGLE) {
            			//单曲循环 则不改变currentNo继续重复当前音乐
            			currentNo = currentNo;
            		}
            	}
        		prepareAndPlay(currentNo);
            }
        });
    }

    /**
     * 上一首
     */
    public void preSong() {
    	mPlayThreadPool.execute(new Runnable() {
            @Override
            public void run() {
            	//若当前播放的是第一首 上一首则是最后一首
        		currentNo = currentNo == 0 ? list.size()-1 : currentNo - 1;
        		prepareAndPlay(currentNo);
            }
        });
    }

    /**
     * 随机播放一首
     */
    public void randomSong() {
    	if(null != list && list.size() > 0) {
    		mPlayThreadPool.execute(new Runnable() {
                @Override
                public void run() {
                	int index = new Random().nextInt(list.size());//获取随机索引
            		prepareAndPlay(index);
                }
            });
    	}
    }

    /**
     * 通知界面UI更新界面下方的播放组件状态和文字 由于是跨线程 所以要用handler来传递消息
     */
    public void updateBottomActionBar() {
    	Message msg = new Message();
    	handler.sendMessage(msg);
    }
    
    /**
     * 初始化播放器
     */
    private void initMediaPlayer() {
    	mp = new MediaPlayer();
    	/*监听缓存 事件，在缓冲完毕后，开始播放*/  
		mp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
			@Override
			public void onPrepared(MediaPlayer mp) {
				
			}
		});
		//播放完毕后自动播放下一首
        mp.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
			@Override
			public void onCompletion(MediaPlayer mp) {
				MusicManager.isAllowProgressBarChanging = false;
				//自动播放下一首
				nextSong(false);
			}
		});
    }
    
    /**
     * 销毁MediaPlayer
     */
    private void destoryMediaPlayer() {
        try {
            if (mp != null) {
            	mp.setOnCompletionListener(null);
            	mp.setOnPreparedListener(null);
            	mp.stop();
            	mp.release();
            	mp = null;
            }
        } catch (Exception e) {
        	e.printStackTrace();
        }
    }
    
    /**
     * 获取当前播放列表
     * @return
     */
    public static List<AbstractMusic> getPlayingList() {
        return list;
    }
    /**
     * 设置播放列表 切换播放列表时用
     * @param list
     */
    public static void setPlayingList(List<AbstractMusic> list) {
        MusicManager.list = list;
    }
    
    /**
     * 获取当前进度
     * @return
     */
	public int getCurrentProgress() {
		if(mp != null && isAllowProgressBarChanging) return mp.getCurrentPosition();
		return 0;
	}
	
	/**
	 * 获取已播放的时间字符串
	 * @return
	 */
	public String getPlayedTimeStr() {
		if(mp != null && isAllowProgressBarChanging)
			return TimeUtil.mill2mmss(this.getCurrentProgress());
		return "00:00";
	}


//	/**
//	 * 通知LyricActivity改变界面信息
//	 */
//	public void sendMessageToLyricActivity() {
//		mPlayThreadPool.execute(new Runnable() {
//            @Override
//            public void run() {
//            	if(null != lyricTextHandler)
//            		lyricTextHandler.sendMessage(new Message());
//            }
//        });
//	}

	public void setHandler(Handler handler) {
		this.handler = handler;
	}
	
//	/**
//	 * 获取当前播放列表的ListView的adapter，用在歌词界面右侧侧滑菜单展示，
//	 * 		在LyricFragment.java中第152行使用
//	 * @return
//	 */
//	public MusicAdapter getMusicAdapter() {
//		return musicAdapter;
//	}
//	/**
//	 * 设置当前播放列表的ListView的adapter，
//	 * 		在LocalMusicFragment.java中第221行使用
//	 * @param musicAdapter
//	 */
//	public void setMusicAdapter(MusicAdapter musicAdapter) {
//		this.musicAdapter = musicAdapter;
//	}
	/**
	 * 获取当前循环模式
	 * @return
	 */
	public LoopMode getLoopMode() {
		return loopMode;
	}
	/**
	 * 设置循环模式
	 * @param loopMode
	 */
	public void setLoopMode(LoopMode loopMode) {
		if(this.loopMode != loopMode)
			this.loopMode = loopMode;
	}

	



	/**
	 * 循环播放模式
	 * @author wuchangyong
	 *
	 */
	public static enum LoopMode {
		LOOP_SINGLE,	//单曲循环
		LOOP_LIST,		//列表顺序循环
		LOOP_RANDOM		//随机循环
	}
	
	
}
